package NEGOCIOS;

import BD.Pagoempleados;
import BD.PersonFactory;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

public class ControlPagoEmpleados {
    //Declaracion de variables globales
    private SessionFactory sessionFactory = null;

    //Metodo para crear la session nesesaria para interactuar con la DB
    private Session createSession() {
        Session session = null;
        try {
            sessionFactory = PersonFactory.getSessionFactory();
            session = sessionFactory.openSession();
        } catch (HibernateException he) {
            JOptionPane.showMessageDialog(null, "Error: " + he, "Error ocurrido"
                    + " en el control de Pagoempleados", 0);
            session.close();
        }
        return session;
    }

    //Metodo que devuelve un pago en especifico
    public Pagoempleados seleccionarUnPago(int id) {
        //Crear objeto nesesaro para obtener la informacion de la DB
        Pagoempleados pago = null;
        //Crear session
        Session session = createSession();
        try {
            //Obtener pago de la BD
            pago = (Pagoempleados) session.createQuery("from Pagoempleados"
                    + " where id=" + id).list().get(0);
            //Si todo sale bien cierro session
            session.close();
        } catch (Exception ex) {
            //Si algo sale mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                   "Error ocurrido al obtener el Pago de empleados solicitado.",
                   0);
            session.close();
        }
        //Regresar el objeto obtenido
        return pago;
    }

    //Metodo que debuelve una lista con todos los pagos guardados en la DB
    public List seleccionarTodosLosPagos() {
        //Crear la lista que contrendra todos los pagos
        List pagos = null;
        //Crear la session
        Session session = createSession();
        try {
            //Obtener todos los pagos guardados en la BD
            pagos = session.createQuery("from Pagoempleados").list();
            //Si todo salio bien cierro session
            session.close();
        } catch (Exception ex) {
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al obtener los Pagos de los empleados.", 0);
            session.close();
        }
        
        //Regresar la lista generada
        return pagos;
    }

    //Metodo para guardar en la base de datos los nuevos pagos realizados
    public void agregarPagoEmpleado(Date fecha, String nombre, char tipoPago,
            String modelo, int cantidad, double precio, double total) {
        //Crear la session nesesaria
        Session session = createSession();
        try {
            //Crear la transaccion
            Transaction transaccion = session.beginTransaction();

            //Crear el objeto que se guardara en la base de datos
            Pagoempleados pago = new Pagoempleados();

            //iniciar transaccion
            transaccion.begin();

            //Colocar los valores deceados
            pago.setFecha(fecha);
            pago.setNombre(nombre);
            pago.setTipopago(tipoPago);
            pago.setModelo(modelo);
            pago.setCantidad(cantidad);
            pago.setPrecio(precio);
            pago.setTotal(total);

            //Guardar en la base de datos
            session.save(pago);

            //Si todo salio bien ejecutamos la transaccion y cierro session
            transaccion.commit();
            session.close();
        } catch (Exception ex) {
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al guardar el pago.", 0);
            session.close();
        }
    }
    
    public void actualizarPagoEmpleado(int id, Date fecha, String nombre, 
            char tipoPago, String modelo, int cantidad, double precio,
            double total){
        //Crear la session nesesaria
        Session session = createSession();
        try{
            //Cargar el objeto que se quiere modificar
            Pagoempleados pago = seleccionarUnPago(id);
            
            //Crear la transaccion
            Transaction transaccion = session.beginTransaction();
            transaccion.begin();
            
            //Modificar el objeto con los nuevos valores de las variables
            pago.setFecha(fecha);
            pago.setNombre(nombre);
            pago.setTipopago(tipoPago);
            pago.setModelo(modelo);
            pago.setCantidad(cantidad);
            pago.setPrecio(precio);
            pago.setTotal(total);
            
            //Guardar el objeto modificado
            session.save(pago);
            transaccion.commit();
            
            //si todo salio bien cerrar session
            session.close();
        }catch(Exception ex){
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al actualizar el pago.", 0);
            session.close();
        }
    }
    
    //Metodo que elimina un pago en espesifico
    public void eliminarPagoEmpleado(int id){
        //Crear session
        Session session = createSession();
        try{
            //Crear transaccion
            Transaction transaccion = session.beginTransaction();
            transaccion.begin();
            //Obtener el pago que se quiere borrar
            Pagoempleados pago = seleccionarUnPago(id);
            //Borrar el pago
            session.delete(pago);
            //Si todo salio bien terminar transaccion y cerrar session
            transaccion.commit();
            session.close();
        }catch(Exception ex){
            //Si algo salio mal reporto el error y cierro session
            JOptionPane.showMessageDialog(null, "Error: " + "\n" + ex, 
                    "Error ocurrido al eliminar el pago.", 0);
            session.close();
        }
    }
    
    public void agregarVariosPagosEmpleados(List<Pagoempleados> empleados){
        for(int i=0;i<empleados.size();i++){
            agregarPagoEmpleado(empleados.get(i).getFecha(), 
                    empleados.get(i).getNombre(), 
                    empleados.get(i).getTipopago(), 
                    empleados.get(i).getModelo(), 
                    empleados.get(i).getCantidad(), 
                    empleados.get(i).getPrecio(), 
                    empleados.get(i).getTotal());
        }
    }
}
